﻿Imports BibliotecaServidor
Imports System.Net.Sockets
Imports VentanaEmergente
Public Class FormServidor

    Inherits System.Windows.Forms.Form
    'Código generado por el Diseñador de Windows Forms
    Dim WithEvents WinSockServer As New BServidor
    'Número de jugadores (por defecto 4)
    Dim numJugadores As Integer = 4




    'Delegado para poder acceder a los miembros del form desde el sub imprimirSmsAlChat
    Delegate Sub ImprimirSmsAlChatIDDelegate(ByVal identificadorIP As System.Net.IPEndPoint, ByVal mensaje As String)
    Delegate Sub ImprimirSmsAlChatDelegate(ByVal mensaje As String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Cogemos la IP del equipo SERVIDOR y la mostramos para que se la dé a los otros jugadores
        '__________________________________________________________________________________________
        Dim ip As Net.Dns
        Dim nombre_Host As String = Net.Dns.GetHostName
        Dim este_Host As Net.IPHostEntry = Net.Dns.GetHostByName(nombre_Host)
        Dim direccion_Ip As String = este_Host.AddressList(0).ToString
        Me.txtIP.Text = direccion_Ip
        '__________________________________________________________________________________________

    End Sub


    Private Sub WinSockServer_ConexionTerminada(ByVal IDTerminal As System.Net.IPEndPoint) Handles WinSockServer.ConexionTerminada
        'Muestro con quien se termino la conexion
        'MsgBox("Se ha desconectado el cliente desde la IP= " & IDTerminal.Address.ToString & ",Puerto = " & IDTerminal.Port)
    End Sub

    Private Sub WinSockServer_DatosRecibidos(ByVal IDTerminal As System.Net.IPEndPoint) Handles WinSockServer.DatosRecibidos
        'Muestro quien envio el mensaje
        'MsgBox("Nuevo mensaje desde el cliente de la IP= " & IDTerminal.Address.ToString & ",Puerto = " & IDTerminal.Port)
        Dim datos As String = WinSockServer.ObtenerDatos(IDTerminal)

        ' comprobamos si es un nuevo cliente y si es así y es su primera cadena en el chat, recuperamos su nick para guardarlo
        If (WinSockServer.obtenerNumeroClientes < numJugadores) Then
            If (datos.StartsWith("0")) Then
                Dim nick As String = datos.Substring(1, datos.IndexOf(" ") - 1)
                WinSockServer.asignarNickClientes(IDTerminal, nick)
                datos = datos.Remove(0, 1)

            ElseIf (datos.StartsWith("cerrar")) Then
                WinSockServer.Cerrar(IDTerminal)
                Exit Sub
            End If

            'Muestro el mensaje recibido
            'Call MsgBox(WinSockServer.ObtenerDatos(IDTerminal))
            imprimirSmsAlChat(datos)


            WinSockServer.EnviarDatos(datos)
        Else
            WinSockServer.EnviarDatos(IDTerminal, "No puedes conectarte, la partida está completa")
        End If
    End Sub

    Private Sub imprimirSmsAlChatID(ByVal IDTerminal As System.Net.IPEndPoint, ByVal sms As String)
        If Me.InvokeRequired Then
            'Si es necesario utilizar Invoke, llamo al delegado
            Me.Invoke(New ImprimirSmsAlChatIDDelegate(AddressOf imprimirSmsAlChatID), New Object() {IDTerminal, sms})
        Else
            'Aquí puedo modificar los controles de esta forma
            txtChat.Text += ControlChars.Lf + sms
        End If

    End Sub

    Private Sub imprimirSmsAlChat(ByVal sms As String)
        If Me.InvokeRequired Then
            'Si es necesario utilizar Invoke, llamo al delegado
            Me.Invoke(New ImprimirSmsAlChatDelegate(AddressOf imprimirSmsAlChat), New Object() {sms})
        Else
            'Aquí puedo modificar los controles de esta forma
            txtChat.Text += ControlChars.Lf + sms
        End If
    End Sub

    Private Sub btnEnviarMensaje_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnviarMensaje.Click
        'Envio el texto escrito en el textbox txtMensaje a todos los clientes
        Try
            imprimirSmsAlChat(Me.txtNick.Text + " dice: " + txtmensaje.Text)
            'Envio lo que esta escrito en la caja de texto del mensaje
            WinSockServer.EnviarDatos(Me.txtNick.Text + " dice: " + txtmensaje.Text)

            txtmensaje.Clear()
            txtmensaje.Focus()
        Catch ex As Exception
            WinSockServer.Cerrar()
            MessageBox.Show(ex.Message)
        End Try
    End Sub


    ''Es un timer con el evento TICK para mostrar quien se conecta y el número de usuarios conectados.
    Private Sub TimerConectados_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TimerConectados.Tick
        '  Muestro quien se conecto
        '  Beep()
        lsConectados.Items.Clear()
        txtClientesConectados.Text = ("Hay " + ((WinSockServer.obtenerNumeroClientes) + 1).ToString + " jugador/es conectados")

        'If ((WinSockServer.obtenerNumeroClientes + 1) = Me.numJugadores) Then
        '    TimerConectados.Stop()
        'End If


        Dim Clientes As New Hashtable
        Clientes = WinSockServer.obtenerClientes()
        Dim K As Net.IPEndPoint

        'agregamos el nombre del servidor para que tb aparezca.
        lsConectados.Items.Add("Nombre: " & txtNick.Text)

        For Each cliente As DictionaryEntry In Clientes
            K = cliente.Key
            lsConectados.Items.Add("Nombre: " & WinSockServer.obtenerNickporID(K))
        Next

        'txtClientesConectados.Text = "Hay " + ((Clientes.Count) + 1).ToString + " jugador/es conectados" + ControlChars.Lf + WinSockServer.ObtenerInformacionTodosCliente
    End Sub

    Private Sub btnPlayServer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPlayServer.Click
        Dim frm As New VentanaEmergente.FormVentanaEmergente
        frm.insertarTEXTO("EL jugador " & Me.txtNick.Text & " se ha conectado.")
        frm.Show()


        Me.txtChat.Clear()

        With WinSockServer
            If txtIP.Text = "" Then
                txtIP.Focus()
                Exit Sub
            ElseIf txtPuertoServer.Text = "" Then
                txtPuertoServer.Focus()
                Exit Sub
            ElseIf txtNick.Text = "" Then
                txtNick.Focus()
                Exit Sub

            End If
            'Establezco el puerto donde escuchar
            .PuertoDeEscucha = txtPuertoServer.Text
            'Comienzo la escucha
            .Escuchar()


            '.asignarNickClientes(.obtenerIDcompleta(txtIP.Text), txtNick.Text)
        End With
        txtmensaje.Focus()
        Panel.Visible = False
        imprimirSmsAlChat(Me.txtNick.Text + " has creado la partida y estás en el Chat")

        'ponemos en la cabecera del FORM que es CLIENTE + ALIAS
        Me.Text += ": " + Me.txtNick.Text


    End Sub

    Private Sub txtChat_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtChat.TextChanged
        'para mantener la barra de desplazamiento actualizada a lo último que escribes.
        txtChat.SelectionStart = txtChat.TextLength
        txtChat.ScrollToCaret()
    End Sub

    Private Sub FormServidor_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        If Disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(Disposing)
    End Sub

    Private Sub FormServidor_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        WinSockServer.EnviarDatos(Me.txtNick.Text & " se ha desconectado. Partida terminada")
        WinSockServer.Cerrar()

        Me.Finalize()
        Me.Dispose()
        Me.Close()
        Process.GetCurrentProcess().Kill()
    End Sub
End Class